﻿using PEPe.Areas.Logado.Models;
using PEPe.BusinessObject;
using PEPe.DataAccessModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PEPe.Areas.Logado.Controllers
{
    public class AgendaController : Controller
    {
        // GET: Logado/Agenda
        public ActionResult Index()
        {
            return View();
        }

        private SelectList getUsuario(int? id)
        {
            UsuarioBO usuarioBO = new UsuarioBO();
            List<Usuario> consulta = usuarioBO.ConsultaTodos();
            List<SelectListItem> enumList = new List<SelectListItem>();

            int idLocal = id == null ? 0 : id.Value;

            foreach (var item in consulta)
            {
                enumList.Add(new SelectListItem
                    {
                        Text = item.Nome,
                        Value = item.Id.ToString()
                    });
            }

            return new SelectList(enumList, "Value", "Text", idLocal);

        }

        private SelectList getProcedimento(int? id)
        {
            ProcedimentoBO procedimentoBO = new ProcedimentoBO();
            List<Procedimento> consulta = procedimentoBO.ConsultaTodos();
            List<SelectListItem> enumList = new List<SelectListItem>();

            int idLocal = id == null ? 0 : id.Value;

            foreach (var item in consulta)
            {
                enumList.Add(new SelectListItem()
                {
                    Text = item.Descricao,
                    Value = item.Id.ToString()
                });
            }

            return new SelectList(enumList, "Value", "Text", idLocal);

        }

        private SelectList getConsulta(int? id)
        {
            ConsultaBO consultaBO = new ConsultaBO();
            List<Consulta> consulta = consultaBO.ConsultaTodos();
            List<SelectListItem> enumList = new List<SelectListItem>();

            int idLocal = id == null ? 0 : id.Value;

            foreach (var item in consulta)
            {
                enumList.Add(new SelectListItem()
                {
                    Text = (!string.IsNullOrEmpty(item.Descricao)) ? item.Descricao : string.Empty,
                    Value = item.Id.ToString()
                });
            }

            return new SelectList(enumList, "Value", "Text", idLocal);

        }

        public ActionResult ConsultaAgenda(jQueryDataTableParamModel param)
        {

            UsuarioLogadoModel usuario = (UsuarioLogadoModel)Session["user"];

            //Monta palavra chave
            string palavraChave = (param.sSearch != null) ? param.sSearch.ToString() : string.Empty;

            //Cria Instancia da BO de motorista
            AgendaBO agendaBO = new AgendaBO();

            //Retorna total de registros para monstar a paginação
            int totalReg = agendaBO.TotalRegistros(usuario.Usuario.Id, palavraChave);

            //Corrige calculo paginação
            int skip = param.iDisplayStart;
            int take = param.iDisplayLength;


            //Consulta dados no banco
            var result = agendaBO.ListarAgendaPaginado(usuario.Usuario.Id, palavraChave, skip, take);


            //Formata saida dos dados para funcionar no DataGrid obrigatório colocar todos parametros que vão aparecer lá
            List<string[]> listaDados = new List<string[]>();
            foreach (var item in result)
            {
                listaDados.Add(new string[] { item.Id.ToString(),                                              
                                              item.DataHora.ToString("dd-MM-yyyy"),
                                              item.Usuario.Nome.ToString(),                                              
                                              item.Procedimento.Descricao.ToString(),
                                              item.Consulta.Descricao.ToString(),
                                              item.Id.ToString(),
                                              item.Id.ToString()

                });
            }

            //Monta Json de Retorno
            JsonResult retorno = Json(new
            {
                sEcho = param.sEcho,
                iTotalRecords = totalReg,
                iTotalDisplayRecords = totalReg,
                aaData = listaDados
            },
            JsonRequestBehavior.AllowGet);

            return retorno;


        }


        public ActionResult AgendaDetalhe(int? id)
        {
            AgendaBO agendaBO = new AgendaBO();
            Agenda retorno = new Agenda();

            if (id != null)
                retorno = agendaBO.ConsultaAgenda(Convert.ToInt32(id));

            SelectList sl1 = getUsuario(retorno.Usuario_Id);
            ViewBag.ddlUsuario = sl1;

            SelectList sl2 = getProcedimento(retorno.Procedimento_Id);
            ViewBag.ddlProcedimento = sl2;

            SelectList sl3 = getConsulta(retorno.Consulta_Id);
            ViewBag.ddlConsulta = sl3;

            if (id == null)
            {
                ViewBag.Data = DateTime.Now.ToString("dd/MM/yyyy");
                ViewBag.Hora = DateTime.Now.ToString("HH:mm:ss");
            }
            else
            {
                ViewBag.Data = retorno.DataHora.ToString("dd/MM/yyyy");
                ViewBag.Hora = retorno.DataHora.ToString("HH:mm:ss");

            }

            return View("AgendaDetalhe", retorno);
        }

        [HttpPost]
        public ActionResult AgendaSalvar(Agenda agenda, string DataHora, int? ddlUsuario, int? ddlProcedimento, int? ddlConsulta, string hora)
        {
            CultureInfo provider = CultureInfo.InvariantCulture;
            AgendaBO agendaBO = new AgendaBO();
            
            if(agenda.Id != 0)
            {
                agenda = agendaBO.ConsultaAgenda(agenda.Id);
            }

            DataHora = DataHora + " " + hora;

            DateTime data = DateTime.ParseExact(DataHora, "dd/MM/yyyy HH:mm:ss", provider);

            UsuarioLogadoModel  objLogado = (UsuarioLogadoModel)Session["user"];

            if (objLogado != null)
            {
                agenda.Usuario_Id = objLogado.Usuario.Id;
            }

            agenda.DataHora = data;
            //agenda.Usuario_Id = ddlUsuario.HasValue ? ddlUsuario.Value : 0;
            agenda.Procedimento_Id = ddlProcedimento.HasValue ? ddlProcedimento.Value : 0;
           
            //Pega Consulta
            string descricaoConsulta = Request.Form["consultaDescricao"];
            
            //agendaBO.Salvar(agenda);

            ConsultaBO consultaBO = new ConsultaBO();
            MedicamentoBO medicamentoBO = new MedicamentoBO();
            ConsultaMedicamentoBO consultaMedicamentoBO = new ConsultaMedicamentoBO();
            
            Consulta consulta = consultaBO.ConsultaByAgendaId(agenda.Id);

            if (consulta == null)
                consulta = new Consulta();

            consulta.Profissional_Id = 1;
            consulta.Descricao = descricaoConsulta;
            consultaBO.Salvar(consulta);

             //Inclui Medicamentos
            if (Request.Form["medicamento"] != null)
            {
                string[] medicamentos = Request.Form["medicamento"].Split(',');

                if (medicamentos.Length > 0)
                {
                    consultaMedicamentoBO.Excluir(consulta.Id);

                    foreach (var item in medicamentos)
                    {
                        Medicamento medicamento = medicamentoBO.ConsultaMedicamentoPorNome(item);                       

                        ConsultaMedicamento consultaMedicamento = new ConsultaMedicamento() { Consulta_Id = consulta.Id, Medicamento_Id = medicamento.Id };
                        consultaMedicamentoBO.Salvar(consultaMedicamento);
                    }
                }
            }          

            agenda.Consulta = consulta;
            agendaBO.Salvar(agenda);

            return View("Index");
        }




        [HttpPost]
        public ActionResult AgendaSalvarAjax(int? usuarioId, int? procedimentoId, int? consultaId, string dataHora)
        {
            AgendaBO agendaBO = new AgendaBO();
            CultureInfo provider = CultureInfo.InvariantCulture;

            agendaBO.Salvar(new Agenda
                {
                    Consulta_Id = consultaId.Value,
                    Procedimento_Id = procedimentoId.Value,
                    Usuario_Id = usuarioId.Value,
                    DataHora = DateTime.ParseExact(dataHora, "dd/MM/yyyy", provider)
                });
            return View("Index");
        }

        public ActionResult AgendaExcluir(int? id)
        {
            AgendaBO agendaBO = new AgendaBO();
            Agenda retorno = new Agenda();

            if (id != null)
                agendaBO.Excluir(Convert.ToInt32(id));

            return View("Index");
        }




        public ActionResult ConsultaAutocomplete(string palavraChave)
        {

            //Cria Instancia da BO de Medicamento
            MedicamentoBO medicamentoBO = new MedicamentoBO();


            //Consulta dados no banco
            var result = medicamentoBO.ListarMedicamentoPaginado(palavraChave, 0, 10);


            //Formata saida dos dados para funcionar no DataGrid obrigatório colocar todos parametros que vão aparecer lá
            //List<TransportAutocomplete> listaDados = new List<TransportAutocomplete>();
            //foreach (var item in result)
            //{
            //    listaDados.Add(new TransportAutocomplete(){
            //                        id = item.Id,                                              
            //                        descricao = item.Descricao

            //    });
            //}

            List<string> listaDados = new List<string>();
            foreach (var item in result)
            {
                listaDados.Add(item.Descricao);
            }

            //Monta Json de Retorno
            JsonResult retorno = Json(listaDados, JsonRequestBehavior.AllowGet);

            return retorno;


        }
    }

    public class TransportAutocomplete
    {

        public int id { get; set; }
        public string descricao { get; set; }
    }
}